import axios from 'axios'
import { layer } from 'vue3-layer'
import Token from '@/api/token.js' 
import router from '@/router'

// 设置 axios 请求的前缀
axios.defaults.baseURL = 'https://api.example.com';
// 设置 axios 默认提交数据的方式
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

// 使用信号量、控制请求、并取消
const controller = new AbortController();
// 对请求进行拦截、如果请求需要loading，则设置loading为true
axios.interceptors.request.use(async function (config) {
	// 配置 信号量、可以当接口调用失败的时候、取消请求
	config.signal = controller.signal; 
    if (config.loading) {
		config.loadIndex = layer.load(2)
	}
	// 如果接口 config 中传入了 permission = true, 或者 没有传入，均代表需要认证
	if (config.permission === undefined || config.permission) {
		// 获取 令牌 
		try{
			const token = await Token.getAccessToken() ; 
			if (token == null) {
				// 引导用户登录、取消请求
				controller.abort() ;
				router.push({name: "login"}) ;
			}
			config.headers["Authorization"] = "Bearer " + token ;
		}catch(e) {
			layer.msg('令牌获取失败', {icon: 2});
			// 令牌获取失败、取消请求
			controller.abort() ;
		}
	}
    return config;
  }, function (error) {
    return Promise.reject(error);
  });

// 对响应进行拦截、
axios.interceptors.response.use(function (response) {
    if (response.config.loading) {
		layer.close(response.config.loadIndex);
	}
    return response.data;
	
  }, function (error) {
	  
	 if (error.response && error.response.config.loading) {
		 layer.close(error.response.config.loadIndex)
	 }
	 
	 // 如果状态码 401
	 if (error.response && error.response.status === 401) {
		 layer.msg('登录失效，请重新登录') ;
	 }else if (error.response && error.response.status === 400) {
		 layer.msg('请求参数有误') ;
	 }else{
		 layer.msg('接口调用失败') ;
	 }
	 return Promise.reject(error);
  });

// 导出 axios
export default axios ; 
// 导出 controller , 用户可以随时自动取消请求
export {controller} ;